/**
 * @author     Gabor Greif <ggreif@gmail.com>
 * @copyright  2009-2010 Gabor Greif
 * @license    http://www.opensource.org/licenses/mit-license.php  MIT License
 * @version    Release: 0.0
 */

#include "CommandMap.hpp"

#include "cValue.hpp"
#include "cSet.hpp"
#include "cUnset.hpp"
#include "cInt.hpp"
#include "cError.hpp"
#include "cPuts.hpp"
#include "cInfo.hpp"
#include "cExit.hpp"
#include "cHex.hpp"
#include "cIf.hpp"
#include "cList.hpp"
#include "cEnvironment.hpp"

#include <ctype.h>
#include <iostream>

#ifndef __APPLE__
#include "Parse.cpp"
#endif

using namespace micker;

struct Rem : Comm<int>
{
    Rem(void)
    : Comm<int>(ArgumentsMismatch<0>::proc<Env, proc>, 0)
    {}

    static std::string proc(Pref env)
        {
            ++env;
            return "";
        }
};

int main(int argc, const char* const argv[])
{
    CommandMap m;
    m.insert("set", Set(m));
    m.insert("unset", Unset(m));
    m.insert("error", Error());
    m.insert("puts", Puts());
    m.insert("info", Info(m));
    m.insert("exit", Exit());
    m.insert("0x", Hex());
    m.insert("dec->hex", Hex(true));
    m.insert("if", If(m));
    m.insert("env", Environment());
    m.insert("llength", List(true));
    m.insert("lindex", List());

    if (argc == 1)
    {
        while (!std::cin.eof()) {
            std::string inp;
            std::getline(std::cin, inp);
            std::cout << "hier: " << inp << std::endl;
            m.parseAndRun(inp);
        }
        return 0;
    }

    std::cout << "Hello, World!\n";
    
    std::deque<std::string> args;
    args.push_back("x");
    args.push_back("42");
    m.run("set", args);
    m.run("x", std::deque<std::string>());
    Int(5);
    // Int("5"); --> causes link error: define conversion!

    m.parseAndRun("set bar 25");
    m.parseAndRun("set quux \"250\"");
    m.parseAndRun("set yadda [quux]");
    

    std::cout << m.parseAndRun("[\"error\" \"brou haha\"]") << "\n";

    m.parseAndRun("set bla {example [unprocessed] script}");
    m.parseAndRun("set s set");
    m.parseAndRun("\"[s]\" groom pack");

    m.parseAndRun("[s] s {example script}");
    m.parseAndRun("{set} foom zack");
    m.parseAndRun("puts \"[foom]\"");
    m.parseAndRun("env \"[foom]\"");
}
